﻿#include "CardGame.h"
#include <ctime>


CardGame::CardGame()
{
	selfCards_node = Node::create();
}
//将0-53的值，转变为对应的某张牌的精灵
Sprite *CardGame::getCardSpriteWithValue(int value)
{
	string file_name = "";

	if (value == 52) {
		// 小王
		file_name = "xiaowang.png";
	}
	else if (value == 53) {
		// 大王
		file_name = "dawang.png";
	}
	else {
		// 如何得到花色？
		int flower = value / 13 + 1;
		// 牌的值？
		int _value = value % 13 + 1;
		switch (flower) {
		case 1: // ♠️
			file_name = StringUtils::format("hei-%d.png", _value);
			break;
		case 2: // ♦️
			file_name = StringUtils::format("fk-%d.png", _value);
			break;
		case 3: // ♣️
			file_name = StringUtils::format("mh-%d.png", _value);
			break;
		case 4: // ♥️
			file_name = StringUtils::format("hong-%d.png", _value);
			break;
		default:
			break;
		}
	}

	Sprite *cardSprite = Sprite::createWithSpriteFrameName(file_name);
	cardSprite->setTag(value);//有助于从父节点通过tag值找到对应的牌的精灵
	return cardSprite;
}

void CardGame::shuffle(int a[], int len) {
	int index, temple, i;
	for (i = 0; i < 54; i++) {
		a[i] = i;
	}
	srand((unsigned)time(NULL));
	for (i = len - 1; i > 0; i--) {
		index = rand() % i;
		// 交换i索引和index索引里储存的值
		temple = a[i];
		a[i] = a[index];
		a[index] = temple;
	}
	// 打印下洗好牌后的情况
	for (i = 0; i < len; i++) {
		CCLOG("%d ", a[i]);
	}
}

//判断是否为王炸
bool isKingBomb(vector<int> arr)
{
	if (arr[0] >= 52 && arr[1] >= 52)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//判断是否为红十炸弹
bool isRedTenBomb(vector<int> arr)
{
	if ((arr[0] == 22 && arr[1] == 48) || (arr[0] == 48 && arr[1] == 22))
	{
		return true;
	}
	else
	{
		return false;
	}
}
//判断是否有王
//bool: is  has did 
bool hasKing(vector<int> arr)
{
	for (int i = 0; i <= arr.size(); i++)
	{
		if (arr[i] >= 52)
		{
			return true;
		}
		return false;
	}
}

//是否为对子
bool isDouble(vector<int> arr)
{
	if (hasKing(arr))
	{
		return false;
	}
	else if(arr[0] % 13 == arr[1] % 13)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//判断是否为三张或四张的炸弹
bool isBomb(vector<int> arr)
{
	//排除王的干扰
	if (hasKing(arr))
	{
		return false;
	}
	bool allSame = true;//假设初始点数都相同
	for (int i = 1; i < arr.size(); i++)
	{
		if (arr[0] % 13 != arr[i] % 13)
		{
			allSame = false;//遇到点数不相同 break结果
			break;
		}
	}
	if (allSame)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//判断是否为顺子
bool isStraight(vector<int> arr)
{
	if (hasKing(arr))
	{
		return false;
	}
	vector<int> vec(14, 0);//vec来记录每个点数出现的次数
	for (int i = 0; i < arr.size(); i++)
	{
		vec[arr[i] % 13] += 1;
	}
	//判断既有K 又有A
	if (vec[12] > 0 && vec[0] > 0)
	{
		vec[0]--;
		vec[13]++;
	}
	//计算vec里连续出现的1的次数，只要出现1后，没出现1就中断
	int count = 0;
	for (int i = 0; i < vec.size(); i++)
	{
		if (vec[i] == 1)
		{
			count++;
		}
		else if(count!=0)
		{
			//连续的1发生中断
			break;
		}
	}
	if (count == arr.size())
	{
		return true;
	}
	else {
		return false;
	}
}

PokerType CardGame::getPokerTepyWithCards(vector<int>arr)
{
	//选择的牌数
	int len = (int)arr.size();
	if (len == 1)
	{
		return PokerType::POKER_TYPE_SINGLE;
	}
	else if(len==2)
	{
		//王炸
		if (isKingBomb(arr))
		{
			return PokerType::POKER_TYPE_KING_BOMB;
		}
		else if(isRedTenBomb(arr))
		{
			return PokerType::POKER_TYPE_REDTEN_BOMB;
		}
		else if(isDouble(arr))
		{
			return PokerType::POKER_TYPE_DOUBLE;
		}
	}
	else if (len == 3||len==4)
	{
		if (isBomb(arr))
		{
			if (len == 3)
			{
				return PokerType::POKER_TYPE_THREE_BOMB;
			}
			else if (len = 4)
			{
				return PokerType::POKER_TYPE_FOUR_BOMB;
			}
	   }
		else if(isStraight(arr))
		{
			return POKER_TYPE_STRAIGHT;
		}

	}
	if (len > 4)
	{
		if (isStraight(arr))
		{
			return POKER_TYPE_STRAIGHT;
		}
	}
	return PokerType::POKER_TYPE_ERROR;
}